#include <iostream>

using i64 = long long;

constexpr int N = 1E6 + 5;

struct heap {
    int v[N];
    int cnt = 0;

    void push(int x) {
        v[++cnt] = x;
        for (int i = cnt, j = i >> 1; j; i = j, j >>= 1) {
            if (v[i] < v[j]) {
                std::swap(v[i], v[j]);
            } else {
                break;
            }
        }
    }

    int top() {
        return v[1];
    }

    void pop() {
        v[1] = v[cnt--];
        for (int i = 1, j = i * 2; j <= cnt; i = j, j = i * 2) {
            if (j + 1 <= cnt && v[j] > v[j + 1]) {
                ++j;
            }
            if (v[i] > v[j]) {
                std::swap(v[i], v[j]);
            } else {
                break;
            }
        }
    }

    void out() {
        for (int i = 0; i < cnt; ++i) {
            std::cout << v[i + 1] << " \n"[i == cnt - 1];
        }
    }
} h;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int n;
    std::cin >> n;

    int op, x;
    while (n--) {
        std::cin >> op;
        if (op == 1) {
            std::cin >> x;
            h.push(x);
        } else if (op == 2) {
            std::cout << h.top() << "\n";
        } else {
            h.pop();
        }
        // h.out();
    }

    return 0;
}